-- 基于协程的设备数据发送器
-- 使用协程实现非阻塞的定时发送功能

-- 设备数据发送间隔（秒）
local SEND_INTERVAL = 30  -- 30秒

-- 上次发送时间
local last_send_time = 0

-- 协程句柄
local timer_coroutine = nil

-- 下次发送时间
local next_send_time = 0

-- 收集设备信息
local function collect_device_info()
    -- 获取设备ID和名称
    local device_id = "unknown"
    local device_name = "未知设备"
    
    -- 使用sendPluginEvent获取设备信息
    if sendPluginEvent then
        device_id = sendPluginEvent(5, "getDeviceld") or "unknown"
        device_name = sendPluginEvent(1, "devname") or "未知设备"
    end
    
    -- 获取配置信息和执行状态
    local config = require('Config/config')
    
    -- 添加详细的调试日志
    print("[DEBUG] 收集设备信息:")
    print("[DEBUG] 设备ID: " .. tostring(device_id))
    print("[DEBUG] 设备名称: " .. tostring(device_name))
    print("[DEBUG] 执行模式: " .. tostring(config.execution_mode))
    print("[DEBUG] 脚本运行状态: " .. tostring(config.is_script_running))
    print("[DEBUG] 游戏状态: " .. tostring(config.gameState))
    print("[DEBUG] 暂停状态: " .. tostring(_G.is_execution_paused))
    
    -- 获取游戏信息收集器中的数据
    local gameInfo = {}
    if gameInfoCollector then
        gameInfo = gameInfoCollector.getGameInfo() or {}
        print("[DEBUG] 从游戏信息收集器获取数据成功")    
    end
    
    -- 确定当前的运行状态
    local running_status = "停止"
    if config.is_script_running then
        if _G.is_execution_paused then
            running_status = "已暂停"
        else
            -- 根据执行模式确定状态
            if config.execution_mode == "wild" then
                running_status = "野外挂机中"
            elseif config.execution_mode == "daily_task" then
                running_status = "日程安排中"
            elseif config.execution_mode == "daily_mission" then
                running_status = "每日任务中"
            else
                running_status = "脚本运行中"
            end
        end
    end
    
    local device_info = {
        device_id = device_id,
        device_name = device_name,
        timestamp = os.time(),
        -- 游戏数据直接从gameInfoCollector获取
        level = tostring(gameInfo.level or 0),
        gold = tostring(gameInfo.gold or 0),
        diamond = tostring(gameInfo.diamond or 0),
        backpack = tostring(gameInfo.bag and gameInfo.bag.available or 0) .. "/" .. tostring(gameInfo.bag and gameInfo.bag.total or 0),
        crystal = "10", -- 这个字段在gameInfo中没有对应，保持原值
        yesterday_output = "5000", -- 这个字段在gameInfo中没有对应，保持原值
        realtime_new = "100", -- 这个字段在gameInfo中没有对应，保持原值
        guild = gameInfo.guild or "无公会",
        combat_stats = tostring(gameInfo.defense and gameInfo.defense.physical or 0) .. "/" .. 
                      tostring(gameInfo.defense and gameInfo.defense.magic or 0) .. "/" .. 
                      tostring(gameInfo.defense and gameInfo.defense.true_damage or 0),
        appearance = gameInfo.profession or "未知职业",
        afk_map = gameInfo.currentMap or "未知地图",
        realtime_afk = "30", -- 这个字段在gameInfo中没有对应，保持原值
        realtime_afk_time = "3600", -- 这个字段在gameInfo中没有对应，保持原值
        realtime_afk_time_seconds = "3600", -- 这个字段在gameInfo中没有对应，保持原值
        realtime_afk_time_minutes = "60", -- 这个字段在gameInfo中没有对应，保持原值
        realtime_afk_time_hours = "1" -- 这个字段在gameInfo中没有对应，保持原值
    }
    
    -- 打印完整的设备信息
    print("[DEBUG] 完整的设备信息:")
    for key, value in pairs(device_info) do
        print("[DEBUG] " .. key .. ": " .. tostring(value))
    end
    
    return device_info
end

-- 发送设备数据
local function send_device_data()
    -- 注意：不再在心跳包中自动更新游戏信息
    -- 游戏信息应该在需要时主动收集，而不是在数据发送时被动更新
    -- 这样可以避免在心跳包中进行UI操作，提高性能
    
    local device_data = collect_device_info()
    
    -- 获取设备ID
    local device_id = ""
    if sendPluginEvent then
        device_id = sendPluginEvent(5, "getDeviceld") or "unknown"
    else
        device_id = "unknown"
    end
    
    -- 构造正确的消息格式 - 将设备数据放在data字段中
    local message = {
        type = "device_data",
        device_id = device_id,
        data = device_data
    }
    
    print("[DEBUG] 构造的消息格式:")
    if jsonLib and jsonLib.encode then
        local encode_success, result = pcall(jsonLib.encode, message)
        if encode_success then
            print("[DEBUG] " .. result)
        else
            print("[DEBUG] 消息格式编码失败: " .. tostring(result))
        end
    end
    
    -- 使用WebSocket客户端发送数据
    local websocket_client = require('Network/websocket_client')
    if websocket_client and websocket_client.send then
        local success = websocket_client.send(message)
        if success then
            last_send_time = os.time()
            print("[INFO] 设备数据发送成功")
            return true
        else
            print("[ERROR] 设备数据发送失败")
            return false
        end
    else
        print("[ERROR] WebSocket客户端不可用")
        return false
    end
end

-- 定时发送协程函数
local function timer_coroutine_func()
    print("[INFO] 启动设备数据定时发送协程，间隔: " .. SEND_INTERVAL .. "秒")
    
    -- 立即发送一次
    send_device_data()
    next_send_time = os.time() + SEND_INTERVAL
    
    while true do
        -- 等待到下次发送时间
        local current_time = os.time()
        if current_time >= next_send_time then
            -- 发送设备数据
            send_device_data()
            next_send_time = current_time + SEND_INTERVAL
        end
        
        -- 让出控制权，等待下次更新
        coroutine.yield()
    end
end

-- 启动定时发送协程
local function start_timer_coroutine()
    if timer_coroutine then
        print("[WARNING] 定时器协程已在运行")
        return false
    end
    
    timer_coroutine = coroutine.create(timer_coroutine_func)
    if timer_coroutine then
        print("[INFO] 设备数据定时发送协程已创建")
        -- 立即启动协程
        local ok, result = coroutine.resume(timer_coroutine)
        if not ok then
            print("[ERROR] 定时器协程启动失败: " .. tostring(result))
            timer_coroutine = nil
            return false
        end
        print("[INFO] 设备数据定时发送协程已启动")
        return true
    else
        print("[ERROR] 定时器协程创建失败")
        return false
    end
end

-- 停止定时发送协程
local function stop_timer_coroutine()
    if timer_coroutine then
        timer_coroutine = nil
        print("[INFO] 设备数据定时发送协程已停止")
        return true
    end
    return false
end

-- 更新协程（在主循环中调用）
local function update_coroutine()
    if timer_coroutine and coroutine.status(timer_coroutine) == "suspended" then
        local ok, result = coroutine.resume(timer_coroutine)
        if not ok then
            print("[ERROR] 定时器协程异常: " .. tostring(result))
            timer_coroutine = nil
        end
    end
end

-- 手动发送一次
local function send_once()
    return send_device_data()
end

-- 设置发送间隔
local function set_interval(seconds)
    if seconds and seconds > 0 then
        SEND_INTERVAL = seconds
        print("[INFO] 设备数据发送间隔已设置为: " .. SEND_INTERVAL .. "秒")
        
        -- 如果协程正在运行，重启它以应用新的间隔
        if timer_coroutine then
            stop_timer_coroutine()
            start_timer_coroutine()
        end
        
        return true
    end
    return false
end

-- 获取状态
local function get_status()
    return {
        is_running = timer_coroutine ~= nil,
        interval = SEND_INTERVAL,
        last_send_time = last_send_time,
        login_status = "由插件端处理",
        coroutine_status = timer_coroutine and coroutine.status(timer_coroutine) or "none"
    }
end

-- 启动定时发送
local function start_sending()
    return start_timer_coroutine()
end

-- 停止定时发送
local function stop_sending()
    return stop_timer_coroutine()
end

-- 导出函数
return {
    start = start_sending,
    stop = stop_sending,
    send_once = send_once,
    set_interval = set_interval,
    get_status = get_status,
    update_coroutine = update_coroutine
}

-- 使用说明：
-- 1. 此模块专注于设备数据发送，不再自动更新游戏信息
-- 2. 游戏信息应该在需要时主动收集，而不是在心跳包中被动更新
-- 3. 支持的游戏信息字段（从gameInfoCollector获取）：
--    - level: 角色等级
--    - gold: 金币数量
--    - diamond: 钻石数量
--    - backpack: 背包格子信息 (可用/总数)
--    - guild: 公会名
--    - combat_stats: 三防信息 (物理/魔法/真实伤害)
--    - appearance: 角色职业
--    - afk_map: 当前挂机地图
-- 4. 其他字段保持原有逻辑，如需调整请修改collect_device_info函数
-- 5. 设计理念：心跳包只负责数据发送，UI操作应该在主逻辑中处理 